package controller;

import java.awt.Component;

import javax.swing.JTextField;

import advance.GameMap;

import gui.MapEditorFrame;

/**Rappresenta la radice di tutti i Controller. Sia A una classe rappresentante
 * solo un oggetto grafico. Si definisce Controller una classe che rileva, gestisce
 * ed eventualmente pilota gli eventi dell'oggetto grafico.
 * <p>Un oggetto grafico puo' poi avere piu' controller: l'editor in effetti ne ha parecchi.
 * Affinche' il Controller possa pilotare al meglio l'oggetto grafico, serve che
 * esso venga collegato al Controller. Cio' avviene attraverso dei metodi (nell'oggetto
 * grafico) "addXXXListener" che associano ad un istanza dell'oggetto grafico un'istanza
 * di un controller.
 * <p>In questa applicazione tutti i Controller possiedono una stessa istanza di MapEditorFrame.
 * Alcuni, per loro necessita', possiedono anche la mappa di gioco che � in creazione dall'utente.
 * Per queste loro esigenze, non esiste un unico piano di eriditariet� dei Controller,
 * ma un intero albero.
 * 
 * @author Koldar
 * @version 1.1
 */
public abstract class Controller {

	/**indica la mappa attuale che l'utente sta modificando. Ogni controller pu� modificare la mappa in modo da soddisfare le richieste dell'utente*/
	protected static GameMap currentmap;
	/**indica la console interna alla finestra grafica su cui scrivere dei messaggi per l'utente.
	 * Sarebbe possibile ricavare questa console di messagistica via {@link #application}, ma in questo modo il suo utilizzo e' piu' immediato*/
	protected static JTextField log;
	
	protected Controller(){
		super();
	}
	
	/**
	 * @return the currentmap
	 * @throws NullStaticObjectException 
	 */
	public static GameMap getCurrentmap() throws NullStaticObjectException {
		if (currentmap==null){
			throw new NullStaticObjectException("Game Map");
		}
		return currentmap;
	}
	/**
	 * @param currentmap the currentmap to set
	 * @throws NullStaticObjectException in caso in cui il parametro sia nullo. la vecchia
	 * non verrà sostituita
	 */
	public static void setCurrentmap(GameMap _currentmap) throws NullStaticObjectException {
		if (_currentmap==null){
			throw new NullStaticObjectException("Game Map");
		}
		try{
			Controller.currentmap.setMap(_currentmap);
		} catch (NullPointerException mapnull){
			Controller.currentmap=_currentmap;
		}
	}
	
	/**imposta il componente su cui disegnare la mappa al valore passato come parametro.
	 * In caso la mappa non sia stata ancora cablata lancia un'eccezione
	 * 
	 * @param parent
	 * @throws NullStaticObjectException
	 */
	public static void setDrawingComponent(Component parent) throws NullStaticObjectException{
		if (currentmap==null){
			throw new NullStaticObjectException("Game Map");
		}
		currentmap.setDrawingComponent(parent);
	}

	/**
	 * @return the log
	 */
	protected static JTextField getLog() {
		return log;
	}

	/**
	 * @param log the log to set
	 */
	public static void setLog(JTextField log) {
		Controller.log = log;
	}
	
	
	
	
	

}
